import os
import cv2
import json


# 读取文件夹返回json文件 filename:文件夹名
def read_json_list(dirname):
    cwd = os.getcwd()
    path = os.path.join(cwd, dirname)
    dirs = os.listdir(path)
    return [i for i in dirs if i[-4:] == 'json']


# 读取json文件的点位，对同名图片绘制圆形，并输入新的图片 json_file：json文件
def read_point_draw_circle(json_list):
    # 查看文件夹是否存在
    cwd = os.getcwd()
    # 输出文件的路径
    output_path = os.path.join(cwd, "output")
    # images和labels合并文件的路径
    all_path = os.path.join(cwd, "all")
    # 判断output文件夹是否存在
    output_exists = os.path.exists(output_path)
    # 如果不存在新建文件夹
    if not output_exists:
        os.mkdir(output_path)
    # 循环读取json文件
    for file in json_list:
        # json文件的路径
        file_path = os.path.join(all_path, file)
        # 生成同名png文件路径
        image_path = os.path.join(all_path, file[:-5] + ".png")
        # json文件的数据
        with open(file_path, 'r') as f:
            data = json.load(f)
        # 获取shapes对应的数据
        shapes = data["shapes"]
        # 通过opencv读取图片
        img = cv2.imread(image_path, 1)
        # 读取所有点位生成列表
        arr = [point["points"][0] for point in shapes]
        # 对第一个点进行操作重新生成图片，后续对last_img进行操作重新生成
        last_img = cv2.circle(img, center=(tuple(map(int, arr[0]))), radius=25, color=(255, 0, 3), thickness=6)
        # 循环json文件的所有标注点
        for point in arr:
            last_img = cv2.circle(last_img, center=(tuple(map(int, point))), radius=25, color=(255, 0, 3), thickness=6)
        output_img_path = output_path + f"/{file[:-5]}.png"
        cv2.imwrite(output_img_path, last_img)


"""
    将all文件夹下面的json文件进行读取。
    根据json的point信息，找到点位进行数据，并读取同名文件，
    在图片的点位上进行图像绘制，生成新的图片。
"""
if __name__ == "__main__":
    # 读取all下面的json文件，返回列表
    dirname = "all"
    json_list = read_json_list(dirname)

    # 传入json列表进行批量操作
    read_point_draw_circle(json_list)
